import GameEvent from "./event/GameEvent";
import { EventType } from "./enum/GameEnum";
import BookEvent_Emit from "./event/BookEvent_Emit";
import BookEvent_Dispatch from "./event/BookEvent_Dispatch";
import TimerManager from "./manager/TimerManager";

const {ccclass, property} = cc._decorator;

@ccclass
export default class MainScene extends cc.Component {

    // 这个属性引用了星星预制资源
    @property(cc.Prefab)
    public starPrefab:cc.Prefab = null;

    // 星星产生后消失时间的随机范围
    @property()
    public maxStarDuration:number = 0;

    @property()
    public minStarDuration:number = 0;

    // 地面节点，用于确定星星生成的高度
    @property(cc.Node)
    public ground: cc.Node = null;
   
    // player 节点，用于获取主角弹跳的高度，和控制主角行动开关
    @property(cc.Node)
    public player: cc.Node = null;

    // 初始化计分
    @property(cc.Label)
    scorelabel: cc.Label = null;

    private score:number = 0;

    private timer:number = 0;
    starDuration: number;
    groundY: number;

    private cTimer:cc.Scheduler;
    private intervalNum: number = -1;//间隔
    private intervalCount: number = 0; //运行的时间

    start () 
    {
        // 初始化计时器
        this.timer = 0;
        this.starDuration = 0;

        // 获取地平面的 y 轴坐标
        this.groundY = this.ground.y + this.ground.height/2;
        // 生成一个新的星星
        this.spawnNewStar();

        // 初始化计分
        this.score = 0;
        
        var intervalTime:number = Math.floor(1000 / cc.game.getFrameRate());
        if(window["setInterval"])
        {
            //100毫秒运行一次
            var frameInterval:number = Math.floor( cc.game.getFrameRate() * 0.1);
            this.intervalNum = window.setInterval(()=>{
                this.intervalCount++;
                if(this.intervalCount >= frameInterval)
                {
                    this.onTimer();
                    this.intervalCount = 0;
                }
            }, intervalTime);
        }
        else
        {
            //this.cTimer = new cc.Scheduler(100);
            // this.timer.addEventListener(egret.TimerEvent.TIMER, self.onTimer, self);
            // this.timer.start();
            // self.addEventListener(egret.Event.ENTER_FRAME, self.onEnterFrame, self);  
        }
    }

    private onTimer(): void 
    {
        TimerManager.ins.run();
    }

    update (dt)
    {
        // 每帧更新计时器，超过限度还没有生成新的星星
        // 就会调用游戏失败逻辑
        if (this.timer > this.starDuration) {
            this.gameOver();
            return;
        }
        this.timer += dt;
    }

    private spawnNewStar() 
    {
        // 使用给定的模板在场景中生成一个新节点
        var newStar = cc.instantiate(this.starPrefab);
        // 将新增的节点添加到 Canvas 节点下面
        this.node.addChild(newStar);
        // 为星星设置一个随机位置
        newStar.setPosition(this.getNewStarPosition());

        // 在星星组件上暂存 Game 对象的引用
        newStar.getComponent('Star').game = this;

         // 重置计时器，根据消失时间范围随机取一个值
        this.starDuration = this.minStarDuration + Math.random() * (this.maxStarDuration - this.minStarDuration);
        this.timer = 0;
    }

    private getNewStarPosition()
    {
        var randX = 0;
        // 根据地平面位置和主角跳跃高度，随机得到一个星星的 y 坐标
        var randY = this.groundY + Math.random() * this.player.getComponent('Player').jumpHeight + 50;
        // 根据屏幕宽度，随机得到一个星星 x 坐标
        var maxX = this.node.width/2;
        randX = (Math.random() - 0.5) * 2 * maxX;
        // 返回星星坐标
        return cc.v2(randX, randY);
    }

    private gainScore()
    {
        this.score += 1;
        // 更新 scoreDisplay Label 的文字
        this.scorelabel.string = 'Score: ' + this.score;
    }

    private gameOver() 
    {   
        this.player.stopAllActions(); //停止 player 节点的跳跃动作
        cc.director.loadScene('MainScene');
    }
}
